import { useUserInfoStore } from "@/store/modules/userInfo";

/**
 * 多个权限验证，满足一个则显示
 * @param {string|string[]} perms 权限代码
 * @returns {boolean}
 */
export const hasAuth = perms => {
  // 没有指定权限要求时，默认通过
  if (!perms || perms.length === 0) return true;
  // 获取用户权限点
  const { auths: userAuths } = useUserInfoStore();
  // 用户没有任何权限时，默认不通过
  if (!userAuths || userAuths.length === 0) return false;
  // 确保 perms 是数组
  const permissions = Array.isArray(perms) ? perms : [perms];
  // 检查是否有任一权限匹配
  return permissions.some(perm => userAuths.includes(perm));
};

/**
 * 多个权限验证，全部满足则显示
 * @param {string|string[]} perms 权限代码
 * @param {string[]} userAuths 用户权限列表
 * @returns {boolean}
 */
export const hasAuthAll = perms => {
  // 没有指定权限要求时，默认通过
  if (!perms || perms.length === 0) return true;
  // 获取用户权限点
  const { auths: userAuths } = useUserInfoStore();
  // 用户没有任何权限时，默认不通过
  if (!userAuths || userAuths.length === 0) return false;
  // 确保 perms 是数组
  const permissions = Array.isArray(perms) ? perms : [perms];
  // 检查是否所有权限都匹配
  return permissions.every(perm => userAuths.includes(perm));
};

/**
 * 权限验证装饰器
 * @param {string|string[]} perms 权限代码
 * @param {Function} callback 回调函数
 * @param {Object} options 配置选项
 */
export const withAuth = (perms, callback, options = {}) => {
  const { $message } = useGlobalMethods();
  const { mode = "any", showMessage = true, message = "您没有权限执行此操作", onAuthFail = null } = options;

  return (...args) => {
    const hasPerm = mode === "all" ? hasAuthAll(perms) : hasAuth(perms);

    if (!hasPerm) {
      if (showMessage && $message) {
        $message.warning(message);
      }
      if (onAuthFail && typeof onAuthFail === "function") {
        onAuthFail();
      }
      return false;
    }

    return callback(...args);
  };
};

/**
 * 异步权限验证装饰器
 * @param {string|string[]} perms 权限代码
 * @param {Function} asyncCallback 异步回调函数
 * @param {Object} options 配置选项
 */
export const withAuthAsync = (perms, asyncCallback, options = {}) => {
  const { $message } = useGlobalMethods();
  const { mode = "any", showMessage = true, message = "您没有权限执行此操作", onAuthFail = null } = options;

  return async (...args) => {
    const hasPerm = mode === "all" ? hasAuthAll(perms) : hasAuth(perms);

    if (!hasPerm) {
      if (showMessage && $message) {
        $message.warning(message);
      }
      if (onAuthFail && typeof onAuthFail === "function") {
        onAuthFail();
      }
      throw new Error("权限不足");
    }

    return await asyncCallback(...args);
  };
};

/**
 * 权限相关组合式函数
 * @returns {Object} 包含权限相关方法的对象
 */
export default function useAuth() {
  return {
    hasAuth,
    hasAuthAll,
    withAuth,
    withAuthAsync,
  };
}
